
import axios from 'axios'
import store from '@/store/index';
import router from '@/router/index';

import { Message } from 'element-ui'
import { getToken, getTimeStamp } from "@/utils/auth";
const instance = axios.create({
  baseURL: '/api'
})

//定义时间
const time = 1000 * 60 * 30
// 设置请求拦截器
instance.interceptors.request.use(config => {
  //得到token
  const token = getToken()
  if (token) {
    // 只有在有token的情况下 才有必要去检查时间戳是否超时
    //得到当前时间
    const currentTime = Date.now()
    //再得到保存token时间
    const tokenTime = getTimeStamp()
    //在得到两者的时间差
    const space = currentTime - tokenTime
    //判断token有没有过期
    if (space >= time) {
      //说明过期
      //清除token
      store.dispatch('user/logout');
      //提示
      Message.info('token超时')
      //跳转登录页
      router.push(`/login?redirect=${window.location.href.split('#')[1]}`)
      return Promise.reject(new Error('token超时'))
    }
    // 设置请求头
    config.headers.Authorization = `Bearer ${token}`
  }
  return config
},
  error => {
    return Promise.reject(error)
  }
)

//设置响应拦截器
instance.interceptors.response.use(response => {
  //结构赋值 方便获取数据不用点出来
  const { data: { success, message } } = response
  //判断请求结果是不是true  true就是成功
  if (success) {
    //返回数据时,直接返回响应的内容
    return response.data
  } else {
    //提示框
    Message.error(message)
    return Promise.reject(new Error(message))
  }
},
  error => {
    console.dir(error)
    //判断返回的状态
    if (
      error.response &&
      error.response.data &&
      error.response.data.code === 10002) {
      //说明token超时
      //(1)删除token
      store.dispatch('user/logout');
      //(2)提示
      Message.info('登录超时,请重新登录')
      //(3)退出登录
      router.push(`/login?_redirect=${window.location.href.split('#')[1]}`)
    }
    //错误要自己抛出 不然user.js&index.vue的方法就出现不了错误 
    //请求方法是抛出去  user接受处理然后抛出  给index最后处理
    return Promise.reject(error)
  }
)

//暴露
export default instance